const https = require("https");
const fs = require("fs");
const Promise = require("bluebird");
// 功能: 下载微信 svg 图文中的所有图片到本地
// 用法: 浏览器复制svg图文中的 html代码到一个新的html文件中  在下面配置项中修改html文件位置
// 控制台>>  node index.js 执行当前脚本

/*
  配置项
*/ 
// html 文件位置
const htmlPath = './lala.html'
// 图片保存位置
const imgSavePath = './imgs'


// 获取所有链接
const linkReg = /(https):\/\/[A-Za-z0-9_\-\+.:?&@=/%#,;]*/gi;
// 第三方链接列表
let thirdPartyLinkList = [];
// 图片列表
let picList = [];
// re = /(https)://[A-Za-z0-9_\-\+.:?&@=/%#,;]*/
// 正则表达式工具  匹配
// ctrl + shift + l 全选匹配项

// 获取html文件中的所有链接
function getLinksFromHTML() {
  const dataStr = fs.readFileSync(htmlPath, "utf-8");
  thirdPartyLinkList = [];
  picList = dataStr.match(linkReg).filter((item) => {
    if (item.indexOf("mmbiz.qpic.cn") === -1) {
      thirdPartyLinkList.push(item);
    } else {
      return item;
    }
  });
  // 数组去重
  picList = Array.from(new Set(picList));
}

function savePic(imgURL, index) {
  // 处理文件格式
  let ext = (function () {
    if (imgURL.indexOf("mmbiz_jpg") !== -1) {
      return "jpeg";
    } else if (imgURL.indexOf("mmbiz_png") !== -1) {
      return "png";
    } else if (imgURL.indexOf("mmbiz_gif") !== -1) {
      return "gif";
    } else {
      return imgURL.split("=").pop();
    }
  })(imgURL);

  return new Promise((resolve, reject) => {
    console.log(`正在下载第${index + 1}张...`);
    https.get(imgURL, (res) => {
      let imgData = "";
      res.setEncoding("binary");
      res.on("data", function (chunk) {
        imgData += chunk;
      });
      res.on("end", function () {
        if (imgData) {
          let filePath = `${imgSavePath}/${index + 1}.${ext}`;
          fs.writeFile(filePath, imgData, "binary", function (err) {
            if (err) {
              reject("down fail");
            } else {
              resolve("down success");
            }
          });
        }
      });
    });
  });
}

function mkdirIMG() {
  fs.exists(imgSavePath, function (exists) {
    if (!exists) {
      fs.mkdir(imgSavePath, function (err) {
        if (err) console.error(err);
      });
    }
  });
}

function getHTMLFromURL () {
  https.get()
}

function init() {
  mkdirIMG();
  getLinksFromHTML();
  // Promise.map 参考: http://bluebirdjs.com/docs/api/promise.map.html
  Promise.map(
    picList,
    (item, index) => {
      console.log(item, index);
      return savePic(item, index);
    },
    {
      // promise 锁
      // If all requests are hitting the same host, then concurrency is probably no more than 5-10 (since a given host can't really do a lots of things at once and asking it to do more than it can do at once just slows it down).
      concurrency: 5,
    }
  )
    .then((res) => {
      console.log("全部完成！");
      console.log(`图片存储在 ${imgSavePath} 目录下`);
    })
    .catch((err) => {
      console.log(err);
    });
}

init();
